這一章只做一件事:把「平台」和「防禦節點」各裝在一台 Ubuntu 上,在內網跑完 「攻擊事件 → 自動建立資安案件 → 人工簽核 → 封鎖落地到防火牆」整圈。 不需要網域、不需要公網 IP、不需要碰 docker。整章只會下三次指令,其餘全部在瀏覽器裡操作。
任何能開兩台 VM 的環境都可以:Proxmox、VMware Workstation、VirtualBox、Hyper-V,或雲端兩台小機器。 規格是練習用(1~3 人同時操作)。
CPU / 記憶體:2 vCPU / 4 GB 以上,主機B建議8GB才順
HD space : 30 GB up
帳號:一個能 sudo 的一般帳號,安裝過程全程用它
裝 Ubuntu 的步驟網路上很多,這裡不重複。裝好後先確認三件事:
#### 兩台都跑一次
lsb_release -d # 22.04 或 24.04
ip -4 addr | grep inet # 記下這台的內網 IP
curl -sI https://github.com | head -1 # 能連外(HTTP/2 200 之類)
至少 12 碼,含大寫、小寫、數字、特殊符號,例如 Practice2026#Ok。 這一組密碼會同時給系統管理員和示範企業的所有帳號用,練習期間好記比安全重要,事後再改。
| 名稱 | 範例 | 用在哪 |
|---|---|---|
| 主機 A 的 IP | 192.168.0.111 | 平台網址、主機 B 的 --backend |
| 主機 B 的 IP | 192.168.0.112 | WAF 網址、管理介面 |
| 你的工作機 IP | (填你自己電腦的 IP) | 主機 B 的 --admin-ips(允許進管理介面的來源) |
| 上面那組密碼 | — | 主機 A 的安裝指令 |
| 主機 | 角色 | 裝什麼 |
|---|---|---|
| 管制端(主機A) | 已安裝 BeakPlatform 的主機 | 平台本體(見 install.sh)。收事件、跑案件流程、寫決策 |
| 防禦端(主機B) | Ubuntu 22.04 / 24.04(2 vCPU、4 GB 以上,建議 6 GB) | WAF(nginx + ModSecurity + OWASP CRS)、Suricata、CrowdSec、Vector、ClickHouse、od-bridge、cloudflared,選用 Grafana / EveBox / Portainer |
#### 本圖就是前兩篇都用到的那張架構圖+事件決策路徑圖的文字版,重覆的不再貼,這張具體而微
你的工作機 ─► 主機 B WAF(8080) ─► 被保護的網站(練習時就填主機 A 的 8000)
│ 告警
Suricata(監聽網卡) ─► Vector ─► od-bridge ──事件──► 主機 A /api/open_defense/intake
│ ▲
▼ │ 每 5 秒拉取封鎖決策
ClickHouse nftables / CrowdSec ◄──┘
兩台之間只有兩條連線:主機 B 把事件「送進」主機 A 的 8000 埠,再從同一個埠「拉回」核可的封鎖決策。 主機 A 不會主動連主機 B,所以主機 B 不需要對主機 A 開任何入站埠。
資料面有三個名詞會一直出現:
名詞|意思
系統企業|安裝時自動建立、代表平台本身的企業,代碼長得像 sys-xxxxxxxxxxxx(每次安裝都不同)。管全平台的系統管理員住在這裡
示範企業 DemoSOC|安裝時順便建好的一家「客戶」,有部門、人員、資安人員角色、事件路由與處置流程。練習全部在這家做
開通字串|一行 ODN1. 開頭的字串,裡面打包了平台網址、事件受理金鑰、執行帳號。主機 B 只要拿到它就知道要連哪裡、用什麼身分
管制平台(主機A)是SaaS設計,有四大硬階層
上面這四個階層各有自己的登入URL與格式,若不搞清楚就會連登入都進不去。
curl -sL https://raw.githubusercontent.com/ethan-beakmask/BeakPlatform/main/scripts/install.sh \
| sudo ADMIN_INITIAL_PASSWORD='<你的密碼>' INSTALL_DEMO=1 bash
不給 ADMIN_INITIAL_PASSWORD 也可以,腳本會在第 6 步停下來要你輸入兩次密碼;但用管線(|)執行時讀不到鍵盤輸入,所以這裡直接寫在指令裡。資料庫密碼與各種金鑰你不必管,沒給的一律自動產生並寫進 .env。
腳本會自動裝 PostgreSQL、Redis、nginx、Python 環境,抓程式碼、建資料庫、種出廠資料、設 systemd 服務, 最後因為 INSTALL_DEMO=1 多做兩件事:建立示範企業 DemoSOC,以及發一組給主機 B 用的開通字串。 全程約 3~5 分鐘,多數時間在裝 Python 套件。
畫面會依序印出 [1/9] 到 [9/9]:系統依賴、PostgreSQL、取得程式碼、Python 虛擬環境、環境變數、 管理員密碼、初始化資料庫、systemd 服務、Nginx。過程不需要你回答任何問題,看著跑完就好。
跑完畫面最下方會有兩段,整段複製存起來。同樣的內容也存在 /opt/BeakPlatform/demo-credentials.txt,只有 root 讀得到(sudo cat 就看得到)。
黃框內直接貼WAF主機就安裝到完
[INFO] 全新安裝完成
URL: http://192.168.0.111:8000/beakplatform/auth/login
系統企業: sys-xxxxxxxxxxxx
管理員: admin@sys-xxxxxxxxxxxx
密碼: (安裝時設定,首次登入須變更)
...
檢查點 A:瀏覽器開 http://192.168.0.111:8000/beakplatform/auth/login ,看得到登入頁。 網址一定要帶 :8000 和 /beakplatform,少一個都是 404。

示範企業還有現成的人:資安人員 linda.hu@demo-soc.example、jason.ling@demo-soc.example, 資安主管 kevin.ye@demo-soc.example,密碼都是同一組。等一下看案件、簽核封鎖,用的就是資安人員。
先用「登入網址」(/auth/org/demo-soc.example/login)以示範企業管理員登入一次,確認能進儀表板。 這個網址是示範企業專屬的,帳號只要填 admin-admin.ops,網域已經在網址裡。
檢查點 B:示範企業管理員登入後直接看到儀表板,左側選單有「開放防禦」。
以下全部在主機 B(防禦節點)上執行。回到第三節主機 A 印出的總結,複製「WAF 主機執行指令」那一行,貼到主機 B 的終端機,再補上被保護網站與你的工作機 IP:
curl -fsSL https://raw.githubusercontent.com/ethan-beakmask/BeakPlatform/main/Integrated-WAF/install.sh -o /tmp/install.sh
sudo bash /tmp/install.sh \
--pair 'ODN1....' \
--backend http://192.168.0.111:8000 \
--admin-ips <你的工作機IP> \
--yes

腳本會裝 docker 與 nftables、抓程式、產生 Suricata / ClickHouse / 防火牆設定、下載 Suricata 規則(約 40 MB)、 啟動所有容器、跑健康檢查,最後印出各服務網址與密碼。全程約 3~6 分鐘,多數時間在抓映像檔。你不需要下任何 docker 指令。

上表所有埠(含 8080)只對主機 A 與 --admin-ips 列的來源開放,其他內網機器連不到,這是安裝腳本用 nftables 鎖的。 所以第六節的 SQL injection 測試要從 --admin-ips 那台機器發。要開放給更多來源,改 /opt/integrated-waf/.env 的 ADMIN_IPS 後 --reconfigure。
在主機 B 上:
sudo bash /opt/integrated-waf/install.sh --verify # 每一項都要綠
sudo bash /opt/integrated-waf/install.sh --test-event # 送一筆假攻擊事件進平台
--verify 會列出容器狀態、WAF 的 SQL injection 探測是否回 403、平台連得到、執行帳號登入成功。 --test-event 送一筆來源 vector、攻擊者 203.0.113.42 的事件,幾秒後 od-bridge 會印 forwarded ... status=200。
回主機 A 的平台,用示範企業的資安人員(linda.hu)登入示範企業, 到「開放防禦 → 資安案件處置中心」,會有一張標題含 TEST- 的案件。
檢查點 C:案件出現,代表主機 B 的事件已經簽章送進主機 A、通過路由、建成案件。這是整章最重要的一個畫面。
接著打開那張案件,填處置意見後按「封鎖攻擊來源」。幾秒內主機 B 的 od-bridge 會印 decision ... action=block target=ip/203.0.113.42,在主機 B 執行 sudo nft list set inet secstack blocklist 會看到 203.0.113.42 timeout 1h; 平台的「開放防禦 → 防禦決策」該筆狀態為 applied。
最後試一次真的攻擊路徑:從你的工作機(就是 --admin-ips 那台)的瀏覽器開 http://192.168.0.112:8080/?id=1' OR 1=1--,攻擊指令應該得到 403,那是 WAF 規則生效在擋;同時 EveBox 與案件處置中心會多出對應的事件與案件。
以下是兩種不同的表單,請別跑錯地方


除了防禦節點自動送事件,任何外部系統也能用 API Key 直接建案件。這一段示範最小可行的做法。
用示範企業管理員登入,「系統安全 → API Key 管理」新增一把,授權範圍勾「資安」分類。secret 只顯示一次,按 [複製] 存起來。
在主機 A 上(任何有 Python 3 的機器都行):
export BP_BASE_URL='http://192.168.0.111:8000/beakplatform'
export BP_KEY_ID='ak_xxxxxxxx'
export BP_SECRET='<剛複製的 secret>'
python3 /opt/BeakPlatform/scripts/bp_trigger.py --list
python3 /opt/BeakPlatform/scripts/bp_trigger.py \
--form-code SEC_INCIDENT_RESPONSE --subject 'TEST-手動建單' \
--field finding_title='TEST-手動建單' --field source_system=manual \
--field severity_id=3 --field actor_ip=203.0.113.42 --field target_host=demo.internal
回 HTTP 201 就成功,案件處置中心會多一張。--list 會列出這把 key 能發動的表單與每張表單接受的欄位名, 填錯欄位平台會回 400 並把合法欄位名列給你。
練習流程本身不需要寄信。真的要收信時,用系統管理員到「主機設定 → 發信服務」建一組 SMTP(以 Gmail 應用程式密碼為例)、設為預設、主要發信服務選 SMTP,按「測試」寄一封確認。

#### 主機 A(會刪資料庫與目錄,不備份)(升級參數是 --update)
echo YES | sudo bash /opt/BeakPlatform/scripts/install.sh --uninstall
# 再跑第三節那一行
#### 主機 B
sudo bash /opt/integrated-waf/install.sh --uninstall --purge
#### 再跑第五節那一行
主機 A 重裝後系統企業代碼與開通字串都會變,主機 B 一定要用新的字串重裝或 --reconfigure,否則 od-bridge 會一直 401。
後面的章節全部在瀏覽器裡操作,不會再回到終端機。